#!/bin/bash

#
## Global ArrayList Declare
#
system::arrayList() {
    local arrayName=${1:?"[${FUNCNAME}] 需要数组名称参数！"'$1:arrayName 数组名称' }
    [[ -n $(system::filterVariableChar $arrayName) ]] && test ${9:?"[${FUNCNAME}] 数组名称包含特殊字符！"'$1:arrayName 数组名称只能包含[下划线，数值，字母]}' }

    local arrayTemplates=()

    #size()获取ArrayList的数组size
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:size() {
            if test ${#} -eq 0; then
                echo "${#@array[@]}"
            else
                test ${#@array[@]} ${@}
            fi
        }'
    )

    #select()模式匹配数值中的元素，若是匹配成功，则输出
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:select() {
            local element=${1:?"[${FUNCNAME}] 需要匹配模式参数！\$1:element 匹配模式参数" }

            for i in ${!@array[@]}; do
                [[ ${@array[i]} =~ ${element} ]] && echo "${@array[i]}"
            done
        }'
    )

    #add()向ArrayList中追加新元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:add() {
            local element=${1:?"[${FUNCNAME}] 需要元素参数！\$1:element 元素参数" }

            while [[ ${#} -gt 0 ]]; do
                @array=(${@array[@]} "${element}")
                shift 1
            done
        }'
    )

    #remove()删除ArrayList中指定索引的元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:remove() {
            local index=${1:?"[${FUNCNAME}] 需要删除元素的索引参数！\$1:index 索引参数" }

            unset @array[${index}]
        }'
    )

    #subArray()从ArrayList中截取子数组
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:subArray() {
            local start=${1:?"[${FUNCNAME}] 需要起始索引位置参数！\$1:start 索引位置参数" }
            local length=${2:?"[${FUNCNAME}] 需要截取长度参数！\$2:length 截取长度参数" }
    
            echo "${@array[@]:${start}:${length}}"
        }'
    )

    #keys()遍历ArrayList中所有元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:keys() {
            echo "${!@array[*]}"
        }'
    )

    #values()遍历ArrayList中所有元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @array:values() {
            echo "${@array[*]}"
        }'
    )

    logger::debug ${FUNCNAME} "开始构建ArrayList对象："${arrayName}
    eval "${arrayName}=()"

    for template in ${!arrayTemplates[@]}; do
        eval "${arrayTemplates[$template]//@array/$arrayName}"
    done
}
